package com.zhuliwei.controller;

import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.RestController;

/**
 * chatgpt控制层
 *
 * @author 朱力维
 * @time 2023/5/13 16:10
 **/
@RestController
public class ChatGPTController {
    @Resource
    private RabbitTemplate rabbitTemplate;

    //智能对话的客户端
//    private final ChatClient chatClient;
//
//    public ChatGPTController(ChatClient.Builder chatClient) {
//        this.chatClient = chatClient.build();
//    }

//    @GetMapping("/ai")
//    public String generation(@RequestParam(value = "userInput",defaultValue = "你是谁") String userInput) {
//        return chatClient.prompt()
//                .user("讲个笑话")
//                .call()
//                .content();
//    }
//    /**
//     * 普通问答
//     */
//    @GetMapping("/chat")
//    public ResponseResult chat(String content, HttpServletRequest request) {
//        // 输入查询余额返回OpenAI钱包余额
//        if (content.contains("查询余额") || ("我的余额").equals(content) || ("余额").equals(content) || ("钱包余额").equals(content)) {
//            String totalUsage = OpenAiUtils.billingUsage();
//            return ResponseResult.okResult("您一共使用了：" + totalUsage + "美元，剩余：" + (5.0 - Double.parseDouble(totalUsage)) + "美元");
//        }
//        if (content.contains("你的主人")) {
//            return ResponseResult.okResult("我的主人是朱力维，java程序猿一枚，还在不断学习长进自己中~如需了解其他信息请咨询本人哦。");
//        }
//        List<String> list = OpenAiUtils.createChatCompletion(content);
//        StringBuilder answer = new StringBuilder();
//        for (String li : list
//        ) {
//            answer.append(li);
//        }
//        ChatContent chatContent = new ChatContent();
//        chatContent.setQuestion(content);
//        chatContent.setAnswer(answer.toString());
//        chatContent.setIpAddress(IPUtil.getIpAddress(request));
//        rabbitTemplate.convertAndSend("fanoutExchange", "", chatContent);
//        return ResponseResult.okResult(answer.toString());
//    }
//
//    /**
//     * 流式问答，返回到控制台
//     */
//    @GetMapping("/streamChat/{content}")
//    public void streamChat(@PathVariable String content) {
//        // OpenAiUtils.createStreamChatCompletion(content, System.out);
//        // 下面的默认和上面这句代码一样，是输出结果到控制台
//        OpenAiUtils.createStreamChatCompletion(content);
//    }
//
//    /**
//     * 流式问答，输出结果到WEB浏览器端
//     */
//    @GetMapping("/streamChatWithWeb")
//    public void streamChatWithWeb(String content, HttpServletResponse response) throws IOException, InterruptedException {
//        // 需要指定response的ContentType为流式输出，且字符编码为UTF-8
//        response.setContentType("text/event-stream");
//        response.setCharacterEncoding("UTF-8");
//        // 禁用缓存
//        response.setHeader("Cache-Control", "no-cache");
//        OpenAiUtils.createStreamChatCompletion(content, response.getOutputStream());
//    }
//
//    /**
//     * 下载图片
//     */
////    @GetMapping("/downloadImage")
////    public void downloadImage(String prompt, HttpServletResponse response) {
////        OpenAiUtils.downloadImage(prompt, response);
////    }
//
//    @GetMapping("/billingUsage")
//    public void billingUsage() {
////        String monthUsage = OpenAiUtils.billingUsage("2023-04-01", "2023-05-01");
////        System.out.println("四月使用：" + monthUsage + "美元");
//        String totalUsage = OpenAiUtils.billingUsage();
//        System.out.println("一共使用：" + totalUsage + "美元");
//    }
//
//    /**
//     * 自定义Token使用（解决单个SpringBoot项目中只能指定唯一的Token[sk-xxxxxxxxxxxxx]的问题，现在可以自定义ChatGPTProperties内容，添加更多的Token实例）
//     */
//    @GetMapping("/customToken")
//    public void customToken() {
//        ChatGPTProperties chatGPTProperties = new ChatGPTProperties();
//        chatGPTProperties.setToken("sk-002xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
//        chatGPTProperties.setProxyHost("127.0.0.1");
//        chatGPTProperties.setProxyPort(7890);
//        OpenAiProxyService openAiProxyService = new OpenAiProxyService(chatGPTProperties, Duration.ZERO);
//        // 直接使用new出来的openAiProxyService来调用方法，每个OpenAiProxyService都拥有自己的Token。
//        // 这样在一个SpringBoot项目中，就可以有多个Token，可以有更多的免费额度供使用了
//        openAiProxyService.createStreamChatCompletion("Java的三大特性是什么");
//    }
}
